package no.ntnu.fp.controllers;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Collections;

import javax.swing.JOptionPane;

import no.ntnu.fp.comparators.AvtaleComparator;
import no.ntnu.fp.console.Options;
import no.ntnu.fp.model.Appointment;
import no.ntnu.fp.storage.DBConnection;

public class AppointmentController extends AbstractController {
	Options options;
	
	public AppointmentController(Options options) {
		this.options = options;
	}

	public void actionCreate(String username, String date, String start, String stop, String description, String place, int numberOfParticipants) {
		Appointment nyAvtale= new Appointment(date, start, stop, description, place, numberOfParticipants);
		options.messageDialog(nyAvtale.toString());

		int ja = 0;
		String[] choices = {"Ja", "Nei"};

		int input = Options.showChoices(choices, "Vil du lagre denne avtalen i databasen?", "Meny");

		if (input == ja) {
			nyAvtale.setUsername(username);
			nyAvtale.save();
		}
	}
	
	public void actionEdit(int aId, String username) {
		Appointment oldAppointment = new Appointment(aId);
		oldAppointment.setUsername(username);
		
		String[] choices = {"Sted", "Dato", "Starter", "Slutter", "Antall deltakere", "Beskrivelse"};
		
		String message = "Hva vil du endre?";
		int input = Options.showChoices(choices,message,"Avtaleendring");
		
		switch(input) {
		case(0): oldAppointment.setPlace(Options.inputDialog("Skriv inn nytt sted for mote: ", oldAppointment.getPlace())); break;
		case(1): oldAppointment.setDate(Options.inputDialog("Skriv inn ny dato:", oldAppointment.getDate())); break;
		case(2): oldAppointment.setStart(Options.inputDialog("Skriv inn nytt starttidspunkt:", oldAppointment.getStart())); break;
		case(3): oldAppointment.setStop(Options.inputDialog("Skriv inn nytt sluttidspunkt:", oldAppointment.getStop())); break;
		case(4): oldAppointment.setNumberOfParticipants(Options.intInputDialog("Skriv inn nytt antall deltakere:", oldAppointment.getNumberOfParticipants())); break;
		case(5): oldAppointment.setDescription(JOptionPane.showInputDialog("Skriv inn ny beskrivelse:", oldAppointment.getDescription())); break;
		}
		
		oldAppointment.edit(input);
	}
	
	public void actionEditFromSelection(String username) {
		int aId = -1;
		aId =  showAppointmentMenu(username);
		actionEdit(aId, username);
	}
	
	private int showAppointmentMenu(String userName)  {
		
		DBConnection db= new DBConnection();

		ArrayList<Integer> aIds = new ArrayList<Integer>();
		ArrayList<String> appointmentDescriptions = new ArrayList<String>();

		String query = "select Avtale.AvtaleID, beskrivelse from OppretterAvtale, Avtale " +
				"where OppretterAvtale.AvtaleID = Avtale.AvtaleID and brukernavn = " + "\"" + userName + "\"";
		ResultSet rs = db.makeSingleQuery(query);
		setResultSet(rs);
		while (next()) {
			int aId = getInt("AvtaleID");
			String description = getString("Beskrivelse");
			aIds.add(aId);
			appointmentDescriptions.add(description);
		}

		String[] appointmentDescriptionsArray = new String[appointmentDescriptions.size()];
		appointmentDescriptions.toArray(appointmentDescriptionsArray);

		int input = Options.showChoices(appointmentDescriptionsArray,"Hvilken avtale vil du endre?", "Avtaleendring");
		closeDBConnection(db);
		return aIds.get(input);
	}
	
	public void actionDelete(int aId, String username) {
		System.out.println("Appointment controller actionDelete: " + username);
		Appointment slettes = new Appointment(aId);
		slettes.setUsername(username);
		slettes.delete();
	}
	
	public void actionDeleteFromSelection(String username) {
		int aId = selectFromDeleteableAppointments(username);
		if (aId == -1) {
			System.out.println("Ingen artikler, good day");
		} else {
			actionDelete(aId, username);
		}
	}
	
	private int selectFromDeleteableAppointments(String username) {
		ArrayList<Appointment> deleteable = Appointment.getDeleteable(username);

		String[] appointmentDescriptionsArray = new String[deleteable.size()];
		
		int i = 0;
		for (Appointment appointment : deleteable) {
			appointmentDescriptionsArray[i] = appointment.getDescription();
			i++;
		}

		int input = Options.showChoices(appointmentDescriptionsArray,"Hvilken avtale vil du slette?", "Slette avtale");
		
		if (input == -1) {
			return -1;
		}
		
		return deleteable.get(input).getAId();
	}
	
	public void showAll() {
		
	}
	
	public void showUserAppointments(String username) {
		String avtaleUtskrift="";
		ArrayList<String> egneAvtaler = new ArrayList<String>();
		DBConnection db = new DBConnection();
		String query=String.format("Select Starttidspunkt, Sluttidspunkt, Dato,Sted,Beskrivelse " +
				"FROM Avtale, OppretterAvtale " +
				"where Avtale.AvtaleID = OppretterAvtale.AvtaleID " +
				"and Brukernavn = " + "\"" + username +  "\"");
		String query2 = "select Starttidspunkt, Sluttidspunkt, Dato,Sted, Beskrivelse " +
				"from Avtale, Moteinnkalling " +
				"where Avtale.AvtaleID = Moteinnkalling.AvtaleID " +
				"and Deltaker = " + "\"" + username + "\"" +
				" and Status = " + "\"" + "Godtatt" + "\"";
		String query3 = "select Starttidspunkt, Sluttidspunkt, Dato, Sted, Beskrivelse " +
				"from Avtale, OppretterMote " +
				"where Avtale.AvtaleID = OppretterMote.AvtaleID " +
				"and Moteleder = " + "\"" + username + "\"";
		ResultSet rs = db.makeSingleQuery(query);
		ResultSet rs2 = db.makeSingleQuery(query2);
		ResultSet rs3 = db.makeSingleQuery(query3);
		setResultSet(rs);
		beforeFirst();
		
		while (next()){
			String dato = getString("dato");
			String sted = getString("sted");
			String beskrivelse = getString("beskrivelse");
			String start = getString("Starttidspunkt");
			String slutt = getString("Sluttidspunkt");
			String avtale = "Dato: " + dato + "   " + "Starttidspunkt: " + start + "   " + "Sluttidspunkt: " + slutt + "   " + " Sted: " + sted + "   " + " Beskrivelse: " + beskrivelse;
			egneAvtaler.add(avtale);
		}
		setResultSet(rs2);
		while (next()){
			String dato = getString("dato");
			String sted = getString("sted");
			String beskrivelse = getString("beskrivelse");
			String start = getString("Starttidspunkt");
			String slutt = getString("Sluttidspunkt");
			String avtale = "Dato: " + dato + "   " + "Starttidspunkt: " + start + "   " + "Sluttidspunkt: " + slutt + "   " + " Sted: " + sted + "   " + " Beskrivelse: " + beskrivelse;
			egneAvtaler.add(avtale);
		}
		setResultSet(rs3);
		while (next()) {
			String dato = getString("dato");
			String sted = getString("sted");
			String beskrivelse = getString("beskrivelse");
			String start = getString("Starttidspunkt");
			String slutt = getString("Sluttidspunkt");
			String avtale = "Dato: " + dato + "   " + "Starttidspunkt: " + start + "   " + "Sluttidspunkt: " + slutt + "   " + " Sted: " + sted + "   " + " Beskrivelse: " + beskrivelse;
			egneAvtaler.add(avtale);
		}
		
		AvtaleComparator avtaleComparator = new AvtaleComparator();
		Collections.sort(egneAvtaler, avtaleComparator);
		
		for(int i=0 ; i < egneAvtaler.size() ; i++){
			avtaleUtskrift = avtaleUtskrift + "\n" + egneAvtaler.get(i);
		}
		options.messageDialog(avtaleUtskrift);
		closeDBConnection(db);
	}
	

	public void showAllAppointments() {
		String avtaleUtskrift="";
		ArrayList<String>avtaler = new ArrayList<String>();
		DBConnection db=new DBConnection();
		String query=String.format("Select Dato,Starttidspunkt,Sluttidspunkt,Sted,Beskrivelse, Brukernavn " +
				"FROM Avtale, OppretterAvtale " +
				"where Avtale.AvtaleID = OppretterAvtale.AvtaleID");
		ResultSet rs = db.makeSingleQuery(query);
		setResultSet(rs);
		beforeFirst();
		while (next()){
			String dato = getString("dato");
			String sted = getString("sted");
			String start = getString("starttidspunkt");
			String slutt = getString("sluttidspunkt");
			String beskrivelse = getString("beskrivelse");
			String brukernavn = getString("Brukernavn");
			String avtale = "Dato: " + dato + "   " + "Starttidspunkt: " + start + "   " + "Sluttidspunkt: " + 
			slutt + "   " + " Sted: " + sted + " ----- " + "Beskrivelse: " + beskrivelse + " -------- Brukernavn: " + brukernavn;
			avtaler.add(avtale);
		}
		
		String query2 = "Select Dato,Starttidspunkt,Sluttidspunkt,Sted,Beskrivelse, Moteleder " +
				"from Avtale, OppretterMote " +
				"where Avtale.AvtaleID = OppretterMote.AvtaleID";
		ResultSet rs2 = db.makeSingleQuery(query2);
		setResultSet(rs2);
		while (next()) {
			String dato = getString("dato");
			String sted = getString("sted");
			String start = getString("starttidspunkt");
			String slutt = getString("sluttidspunkt");
			String beskrivelse = getString("beskrivelse");
			String brukernavn = getString("Moteleder");
			String avtale = "Dato: " + dato + "   " + "Starttidspunkt: " + start + "   " + "Sluttidspunkt: " + 
			slutt + "   " + " Sted: " + sted + " ----- " + "Beskrivelse: " + beskrivelse + " -------- Moteleder: " + brukernavn;
			avtaler.add(avtale);
		}
		
		String query3 = "Select Dato,Starttidspunkt,Sluttidspunkt,Sted,Beskrivelse,Status,Deltaker " +
				"from Avtale, Moteinnkalling " +
				"where Avtale.AvtaleID = Moteinnkalling.AvtaleID";
		ResultSet rs3 = db.makeSingleQuery(query3);
		setResultSet(rs3);
		while (next()) {
			String dato = getString("dato");
			String sted = getString("sted");
			String start = getString("starttidspunkt");
			String slutt = getString("sluttidspunkt");
			String beskrivelse = getString("beskrivelse");
			String brukernavn = getString("deltaker");
			String status = getString("Status");
			String avtale = "Dato: " + dato + "   " + "Starttidspunkt: " + start + "   " + "Sluttidspunkt: " + 
			slutt + "   " + " Sted: " + sted + " ----- " + "Beskrivelse: " + beskrivelse + " -------- Motedeltaker: "
			+ brukernavn + " -------- " + "Status: " + status;
			avtaler.add(avtale);
		}
		
		AvtaleComparator avtaleComparator = new AvtaleComparator();
		Collections.sort(avtaler, avtaleComparator);

		for(int i=0;i<avtaler.size();i++){
			avtaleUtskrift=avtaleUtskrift+"\n"+avtaler.get(i);
		}
		JOptionPane.showMessageDialog(null,avtaleUtskrift);
	}

}
